//
//  YCStatusListViewModel.swift
//  WeiboDemo
//
//  Created by 尹成 on 2017/1/11.
//  Copyright © 2017年 yc. All rights reserved.
//

import Foundation

/// 上拉加载不到数据时，最大可重试次数
private let maxPullupTryTimes = 3

/// 父类的选择: 
/**
    - 如果累需要使用 'KVC' 或字典转模型框架设置对象值,类就需要继承自 NSObject
    - 如果类只包装一些代码逻辑(只写了些函数),可以不用任何父类,好处:更加轻量
    - 提示: 如果用OC写,一律都继承自 NSObject
 */


/// 使命: 负责微博的数据处理
class YCStatusListViewModel {
    
    private var pullupErrorTimes = 0
    
   /// 微博模型数组懒加载
   lazy var statusList = [YCStatus]()
        
    /// 加载微博列表
    ///
    /// - Parameters:
    ///   - isPullup: 是否是需要加载更多
    ///   - completion: 完成回调[网络请求是否成功，是否需要刷新]
    func loadStatus(isPullup:Bool,completion:@escaping (_ isSuccess:Bool,_ shouldRefresh:Bool) -> ()) {
        
        if isPullup && pullupErrorTimes > maxPullupTryTimes {
            completion(true,false)
            return
        }
        
       // var since_id:Int64 = 0
       // var max_id:Int64 = 0
       // //判读刷新还是加载
       // if isPullup {
       //     max_id = statusList.last?.id ?? 0
       // } else {
       //     since_id = statusList.first?.id ?? 0
       // }
        
        //👆方法啰嗦,精简为👇,实现效果相同，三目是为了简化书写方便阅读，如果三目过长不利于阅读，则建议使用ifelse判读
        
        let since_id = isPullup ? 0 : statusList.first?.id ?? 0
        let max_id = !isPullup ? 0 : statusList.last?.id ?? 0
        
        YCNetworkManager.shared.statusList(since_id, max_id) { (result, isSuccess) in
            //1.字典转模型
            guard let arry = NSArray.yy_modelArray(with: YCStatus.self, json: result ?? []) as? [YCStatus] else {
                completion(true,false)
                return
            }
            // FIXME: 上拉加载不到数据时（即数据全部加载完成时） 的处理
          //  print("刷新了 (\(arry.count)) 条数据")
            
            //2.拼接数据,
          //  //上拉:将结果拼接在数组前面
          //  self.statusList = arry + self.statusList
          //  //下拉:
          //  self.statusList += arry
            
            //👇 使用 三目运算符 精简👆
            
            self.statusList = isPullup ? self.statusList + arry : arry + self.statusList
            
            if isPullup && arry.count == 0 {
                self.pullupErrorTimes += 1
                completion(true,false)
            } else {
                completion(true,true)
            }

        }
        
    }
}
